###############################################################单继承
class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show(self):
        print(f'大家好，我叫：{self.name}，今年{self.age}岁了。')


# Student(Person)：()中表示要继承的父类的类名
# python是多继承，()中可以写多个类名用,区分，默认情况下，不写的话默认继承Object类
class Student(Person):

    def __init__(self, name, aget, stuno):
        # 集成一个父类时
        # 子类调用父类的初始化方法可以一直用用 super().__init__ 调用父类的初初始化方法
        # 集成多个父类的话就不是这个写法了。
        super().__init__(name, aget)
        self.stuno = stuno

    # 字符重写父类的方法
    def show(self):
        # 子类方法调用父类方法用super关键字
        super().show()
        print(f'我的学号是：{self.stuno}')


stu = Student('zhumq', 16, 1001)
stu.show()

print('-' * 40)


###############################################################多继承

class FatherA:
    def __init__(self, name):
        self.name = name

    def showA(self):
        print(f'我的名字叫{self.name}')

    def show(self):
        print(f'FatherA:我的名字叫{self.name}')


class FatherB:
    def __init__(self, age):
        self.age = age

    def showB(self):
        print(f'我今年{self.age}岁了。')

    def show(self):
        print(f'FatherB:我今年{self.age}岁了。')


# 多继承,()中写多个父类名称
# 如果多个父类中定义了相同的实例方法，子类只会有一个这个实例方法。
# 以继承的顺序为作为相同方法的优先级。

class Son(FatherA, FatherB):

    def __init__(self, name, age, gender):
        # 多继承的时候不能用super去调用父类的初始化方法，而是用 父类名称.__init__
        FatherA.__init__(self, name)
        FatherB.__init__(self, age)
        self.gender = gender


son = Son('yinsc', 18, '男')

son.showA()
son.showB()

# 输出：FatherA:我的名字叫yinsc
# 这是因为：class Son(FatherA, FatherB) FatherA写在了前面
son.show()


############################################################### ABC模块


# abc 模块是 Python 中用于定义抽象基类（Abstract Base Classes, ABC）的工具。
# 抽象基类的主要作用是定义接口或规范，强制子类实现特定的方法或行为。
# 它在设计模式、框架开发和代码规范中非常有用。


# 导入abc模块
from abc import ABC, abstractmethod

# 定义抽象类
# ABC 类用于定义抽象基类。继承自 ABC 的类是抽象类。
# 和java一样，抽象类不能被实例化，实现了所有的抽象方法的子类才可以被实例化
class Animal(ABC):

    # @abstractmethod
    # 用于标记抽象方法。子类必须实现这些方法，否则会抛出 TypeError。
    @abstractmethod
    def say(self):
        pass

class Dog(Animal):
    def say(self):
        print("wang~~~")

class Cat(Animal):
    def say(self):
        print("meow~~~")

dog = Dog()
cat = Cat()

dog.say()
cat.say()
